package com;

import java.awt.Graphics;
import java.awt.Point;
import javax.swing.JPanel;

/**
 *
 * @author Alex Muñoz   -   Mauricio Orellana.
 * @version 2012-07-13
 */
public class Grid extends JPanel
{

    private int size;
    private Figure[][] figuras;
    private Point puntoGuardar;
    
    /**
     * Constructor de objetos de la clase Grid
     * 
     * @param size Tamaño del tablero. 
     */
    public Grid(int size)
    {
        super();
        this.size = size;
        this.figuras = new Figure[size][size];
    }
    
    /**
     * Retorna el punto auxiliar que ha sido guardado
     * 
     * @return Retorna un punto guardado. 
     */
    public Point getPuntoGuardar() {
        return this.puntoGuardar;
    }

    /**
     * Modifica el punto auxiliar guardado.
     * 
     * @param puntoGuardar El nuevo punto auxliar.
     */
    public void setPuntoGuardar(Point puntoGuardar) {
        this.puntoGuardar = puntoGuardar;
    }
    
    @Override
    public void paint(Graphics g)
    {
        
        for(int i = 0; i<size; i++)
        {
            for(int j = 0; j<size; j++)
            {
                g.drawRect(0, 0, 100*(i+1), 100*(j+1));
            }
        }
    }
    
    
    /**
     * Dado un punto determina su posicion en la matriz
     * 
     * @param p Punto que sea desea saber a que posicion de la matriz pertenece.
     * @return Verdadero si el punto pertenece a la matriz, falso si no pertenece.
     */
    public boolean verZona(Point p)
    {
        if( p.getX() >= this.getX() && p.getX() <= (this.getX() + (100*this.size)) && p.getY() >= this.getY() && p.getY() <= (this.getY() + (size*100))){
            int fila = (((p.y+50)/100)-1);
            int columna = (((p.x+this.getX())/100)-1);

            this.puntoGuardar = new Point( fila, columna);
            return true;
        }
        return false;
    }
    
    /**
     * Coloca una figura en el tablero
     * 
     * @param fig La figura a colocar en el tablero.
     * @param validate Si se verificará la regla de adyacencia.
     * @return Retorna verdadero si la figura ha sido agrega al tablero de juego, falso si no ha sido agregada.
     */
    public boolean setFigure(Figure fig, boolean validate)
    {
        int x = puntoGuardar.x;
        int y = puntoGuardar.y;
        
        if(figuras[x][y] == null)
        {   
            if(validate)
            {
                if(x-1>=0 && this.figuras[x-1][y]!=null && this.figuras[x-1][y].getDown()!=fig.getUp())
                {
                    return false;
                }
                if(x+1<size && this.figuras[x+1][y]!= null && this.figuras[x+1][y].getUp()!=fig.getDown())
                {
                    return false;
                }
                if(-1+y>=0 && this.figuras[x][-1+y]!=null && this.figuras[x][y-1].getRight()!=fig.getLeft())
                {
                    return false;
                }
                if(y+1<size && this.figuras[x][y+1]!=null && this.figuras[x][y+1].getLeft()!=fig.getRight())
                {
                    return false;
                }
        }
          
            this.figuras[x][y] = fig;
            this.figuras[x][y].setBounds((y*100)+50,(x*100)+50, 100, 100);
            this.figuras[x][y].setPressed(false);
            return true;
        }
        return false;
    }
    
    public void setFiguras(int f, int c, Figure fig)
    {
        this.figuras[f][c] = fig;
    }
    
    public Figure getFiguras(int f, int c)
    {
        return this.figuras[f][c];
    }
    
}
